package com.yidu.action;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yidu.action.vo.ListenBranchSellVo;
import com.yidu.common.JsonMsg;
import com.yidu.common.Message;
import com.yidu.common.Pages;
import com.yidu.common.Tools;
import com.yidu.domain.ListenBackstageUser;
import com.yidu.domain.ListenBranchSell;
import com.yidu.domain.ListenBranchSellDetail;
import com.yidu.domain.ListenFinance;
import com.yidu.domain.ListenFinanceDetail;
import com.yidu.domain.ListenStock;
import com.yidu.domain.ListenStockRecord;
import com.yidu.service.ListenBranchSellDetailService;
import com.yidu.service.ListenBranchSellService;
import com.yidu.service.ListenFinanceDetailService;
import com.yidu.service.ListenSellService;
import com.yidu.service.ListenStockRecordService;

/**
 * 
 * 类说明:分店零售的controller类
 * @author 聂菲
 * @date 2018年12月6日
 */
@Controller
@RequestMapping("/listenBranchSell")
public class ListenBranchSellController {

	/**
	 *使用注入分店零售订单service
	 */
	@Resource
	ListenBranchSellService service;

	/**
	 *使用注入分店零售订单详情service
	 */
	@Resource
	ListenBranchSellDetailService detailService;

	/**
	 *使用注入总店销售service
	 */
	@Resource
	private ListenSellService listenSellService;

	/**
	 *使用注入库存记录service
	 */
	@Resource
	private ListenStockRecordService stockRecordService;
	
	/**
	 *使用注入财务记录明细Service
	 */
	@Resource
	private ListenFinanceDetailService financeDetailService;
	
	
	/**
	 * 增加订单
	 * @param str		拼接字符串
	 * @param sum		合计
	 * @param member	数量
	 * @param session	session
	 * @return
	 */
	@RequestMapping("addTotal")
	@ResponseBody
	public JsonMsg addTotal(String str,String sum,String member,HttpSession session) {
		//取session
		ListenBackstageUser user =  (ListenBackstageUser) session.getAttribute("user");
		//根据#号截取每行数据
		String[] string = str.split("#");
		//定义一个Integer变量count
		Integer count = 0;
		//定义折扣的String变量discount
		String discount=null;
		//循环根据#号截取的数据
		for (int i = 0; i < string.length; i++) {
			//把数据根据   , 分割
			String[] str2 = string[i].split(",");
			//取到商品数量(位置10)
			String number = str2[10];
			//给count赋值
			count+=Integer.parseInt(number);
			//得到商品的折扣(位置6)
			String discounts=str2[6];
			//给折扣赋值
			discount=discounts;
		}
		//根据￥取到总金额(位置0)
		String sumMoney = sum.split("￥")[0];
		//创建零售订单对象
		ListenBranchSell sell = new ListenBranchSell();
		//给零售ID赋值(10位随机数)
		sell.setBsId(Tools.getRandomString(10));
		//给分公司ID赋值
		sell.setCompanyId(user.getSite());
		//创建大数据对象把取到的总金额放进去
		BigDecimal moneys = new BigDecimal(sumMoney);
		//给总金额BsPrice赋值
		sell.setBsPrice(moneys);
		//是否有效Isva赋值(默认为1有效)
		sell.setIsva(1);
		//时间赋值(工具类的得到当前时间)
		sell.setBsTime(Tools.getCurDateTime());
		//操作人赋值(session中的名字)
		sell.setOper(user.getBuName());
		//总数量BsNumber赋值count
		sell.setBsNumber(count);
		//给sort赋值默认为1(点击确认发货后变2)
		sell.setSort("1");
		//给商品的折扣赋值(判断如果discount为空或者member为空)
		if("暂无".equals(discount)||discount=="暂无"||member==null||member==""){
			//给会员id赋值
			sell.setMemberId("1");
			//给折扣赋值
			sell.setDiscount(BigDecimal.valueOf(Integer.valueOf(1)));
		}else{
			//给会员id赋值member
			sell.setMemberId(member);
			//给折扣赋值discount
			sell.setDiscount(BigDecimal.valueOf(Double.valueOf(discount)));
		}
		//调用增加批发订单的方法
		int rows = service.insertTotal(sell);
		//定义一个变量int
		int rowa = 0;
		//循环根据#号截取的数据
		for (int i = 0; i < string.length; i++) {
			//把数据根据，分割
			String[] str2 = string[i].split(",");
			//得到商品IDcomId(位置为0)
			String comId = str2[0];
			//得到商品价格money(位置为5)
			String money = str2[5];
			//得到商品总价all(位置为3)
			String all = str2[3];
			//得到商品数量number(位置为10)
			String number = str2[10];
			//得到乐器名称muName(位置为1)
			String muName=str2[1];
			//得到乐器类型mtName(位置为2)
			String mtName=str2[2];
			//得到小计sumMu(位置为8)
			String sumMu = str2[8];
			//创建零售详情对象
			ListenBranchSellDetail sellDetail = new ListenBranchSellDetail();
			//给销售明细id赋值(得到订单编码格式:日期格式如:20161222211800,分别代表的是年月日时分秒+5位随机字符串)
			sellDetail.setBsdId(Tools.getDateOrderNo());
			//给商品ID赋值comId
			sellDetail.setMuId(comId);
			//给零售订单ID赋值sell中取到的订单ID
			sellDetail.setBsId(sell.getBsId());
			//给乐器名称赋值
			sellDetail.setMuName(muName);
			//给乐器类型赋值
			sellDetail.setMtName(mtName);
			//创建大数据模型对象(把money放进去)
			BigDecimal money2 = new BigDecimal(money);
			//给金额赋值money2
			sellDetail.setRetailPrice(money2);
			//给数量MuNumber赋值
			sellDetail.setMuNumber(Integer.valueOf(number));
			//建大数据模型对象(把all放进去)
			BigDecimal allMoney = new BigDecimal(all); 
			//给总金额RetailPrice赋值allMoney
			sellDetail.setRetailPrice(allMoney);
			//是否有效赋值(默认为1)
			sellDetail.setIsva(1);
			//给时间赋值(得到当前日期时间 yyyy-MM-dd HH:mm:ss)
			sellDetail.setOpenTime(Tools.getCurDateTime());
			//给操作人赋值(session中取到的名字)
			sellDetail.setOper(user.getBuName());
			//给合计(小计)Subtotal赋值转换好之后的sumMu
			sellDetail.setSubtotal(BigDecimal.valueOf(Double.valueOf(sumMu)));
			//调用销售详情增加的方法
			rowa = detailService.insertTotal(sellDetail);
		}
		//创建JsonMsg对象
		JsonMsg msg = new JsonMsg();
		//判断  如果条件成立   就赋值为成功   如果没成立  就赋值为失败
		if( rows > 0 && rowa > 0){
			msg.setDatas(0);
			msg.setMsg("购买成功！");
			return msg;
		}else{
			msg.setDatas(1);
			msg.setMsg("购买失败！");
			return msg;
		}
	}

	/**
	 * 查询所有订单
	 * @return
	 * @throws ParseException 
	 */
	@RequestMapping("findAll")
	@ResponseBody
	public Map<String, Object> findAll(ListenBranchSellVo lv){
		//创建Map集合
		Map<String, Object> map = new HashMap<>();
		//如果CompanyName不为空，就将其赋值于map中
		if(!Tools.isEmpty(lv.getCompanyName())){
			map.put("companyName", lv.getCompanyName());
		}
		//如果StartBsTime不为空，就将其赋值于map中
		if(!Tools.isEmpty(lv.getStartBsTime())){
			map.put("startBsTime", lv.getStartBsTime()+" 00:00:00");
		}
		//如果EndBsTime不为空，就将其赋值于map中
		if(!Tools.isEmpty(lv.getEndBsTime())){
			map.put("endBsTime", lv.getEndBsTime()+" 23:59:59");
		}
		//分页   如果page不为空 limit不为空
		if(lv.getPage()!=null && lv.getLimit()!=null) {
			//创建一个page对象
			Pages page=new Pages();
			//把lv里接收到的page赋值给CurPage
			page.setCurPage(lv.getPage());
			//把lv里接收到的limit赋值给MaxResult
			page.setMaxResult(lv.getLimit());
			//再把赋值好的字段放入map中  分别是FirstRows和MaxResult
			map.put("firstRows", page.getFirstRows());
			map.put("maxResult", page.getMaxResult());
		}
		//用list来接受service查询所有的结果
		List<ListenBranchSellVo> list = service.findAll(map);
		//用int变量来接收service查询到的行数
		int rows=service.findCount(map);
		//创建一个map集合
		Map<String, Object> layuiMap=new HashMap<>();
		//把code、msg、count、data分别放入map中
		layuiMap.put("code", 0);
		layuiMap.put("msg", "");
		layuiMap.put("count",rows);
		//将list放入map中
		layuiMap.put("data", list);
		//把map集合返回到前台去
		return layuiMap;
	}


	/**
	 * 减库存加财务
	 * @param lv
	 * @param session
	 */
	@RequestMapping("stockAddMoney")
	@ResponseBody
	public Message stockAddMoney(String comId,String bsId,HttpSession session){
		//取session
		ListenBackstageUser user =  (ListenBackstageUser) session.getAttribute("user");
		//定义一个double变量
		double sum=0.00;
		//调用service里修改状态的方法
		service.updateSort(bsId);
		//通过零售订单ID查询的到一个List集合
		List<ListenBranchSell> list2 = service.findMuId(bsId);
		//foreach循环
		for (ListenBranchSell vo : list2) {
			//调用service里根据商品id、商品名称以及session中的公司id来减库存的方法
			service.reduceStock(vo.getMuId(),vo.getMuNumber(),user.getSite());
			//把上面定义好的变量进行赋值
			sum+=vo.getSubtotal();
			//通过零售订单ID查询的到一个订单详情的List集合
			List<ListenBranchSellDetail> list = service.findDetail(bsId);
			//foreach循环
			for (ListenBranchSellDetail listenBranchSellDetail : list) {
				//用库存对象来接收根据商品id以及session中的公司id查询出的数据
				ListenStock findkc=service.findByStockId(listenBranchSellDetail.getMuId(),user.getSite());
				//创建一个库存记录对象
				ListenStockRecord listenStockRecord = new ListenStockRecord();
				//给库存记录id赋值随机数30位
				listenStockRecord.setSrId(Tools.getRandomString(30));
				//把查出来的库存ID赋值到库存记录对象中
				listenStockRecord.setStockId(findkc.getStockId());
				//把查出来的商品名称赋值到库存记录对象中
				listenStockRecord.setMuName(listenBranchSellDetail.getMuName());
				//给出入库时间赋值
				listenStockRecord.setSrTime(new Date());
				//给出入库数量赋值
				listenStockRecord.setSrNumber(listenBranchSellDetail.getMuNumber());
				//给出入库说明赋值
				listenStockRecord.setSrExplain("零售出库");
				//给出入库时间赋值
				listenStockRecord.setOpenTime(new Date());
				//取到session中的操作人赋值给Oper
				listenStockRecord.setOper(user.getBuName());
				//给是否有效赋值  默认为1(有效)
				listenStockRecord.setIsva(1);
				//增加库存明细记录
				int insertSelective = stockRecordService.insertSelective(listenStockRecord);
			}
		}
		//调用根据id查询所有并返回模型类的的方法 
		ListenBranchSell findAllById = service.findAllByBsId(bsId);
		//调用根据零售订单id查询财务id返回类对象的方法
		ListenFinance financeId = service.findCwId(bsId);
		//获取财务明细模型类对象
		ListenFinanceDetail financeDetail = new ListenFinanceDetail();
		//用工具类获取财务明细uuid(随机30位)
		String uuid=Tools.getRandomString(30);
		//将得到的30位随机数赋值给财务明细id
		financeDetail.setFdId(uuid);
		//将查到的财务id赋值到财务对象中去
		financeDetail.setFinanceId(financeId.getFinanceId());
		//获取时间类对象
		Date date=new Date();
		//将取到的当前时间赋值到财务明细中去
		financeDetail.setFdTime(date);
		//将查询出的金额赋值到财务明细中去
		financeDetail.setFdPrice(findAllById.getBsPrice());
		//将查询出来的订单ID赋值给业务id
		financeDetail.setVocationalWorkId(findAllById.getBsId());
		//将查询出的数量赋值给订单详情的数量字段
		financeDetail.setFdNumber(findAllById.getBsNumber());
		//给是否有效赋值  默认为1(有效)
		financeDetail.setIsva(1);
		//将取到的当前时间赋值给操作时间赋值
		financeDetail.setOpenTime(date);
		//取到session中的操作人赋值给Oper
		financeDetail.setOper(user.getBuName());
		//给出入账说明赋值
		financeDetail.setSort("收入，分公司零售");
		//给支出类型赋值(1.总公司采购 2.总公司销售 3.分公司采购 4.分公司批发 5.分公司零售)
		financeDetail.setSpendingtype(4);
		//调用增加财务记录明细返回int的方法
		int insertSelective = financeDetailService.insertSelective(financeDetail);
		//调用service根据公司id和总金额的修改金钱方法
		service.updateMoney(comId,sum);
		//创建一个工具类JsonMsg对象
		Message msg = new Message();
		//默认为  1  (发货成功)
		msg.setMsg("发货成功");
		msg.setState(1);
		//把提示返回出去
		return msg;
	}

	/**
	 * 查询库存是否足够
	 * @param listenSell
	 * @return
	 */
	@RequestMapping("findByMusical")
	@ResponseBody
	public List<ListenStock> findByMusical(String muId,HttpSession session) {
		//取session
		ListenBackstageUser user =  (ListenBackstageUser) session.getAttribute("user");
		//根据乐器ID查询库存数量
		List<ListenStock> list = service.findByMusicalNumber(muId,user.getSite());
		//把查询出来的list返回出去
		return list;
	}
}

